package com.cg.leetcode;

import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 763.划分字母区间
 *
 * @author cg
 * @program LeetCode->LeetCode_763
 * @create 2022-09-08 16:23
 **/
public class LeetCode_763 {

    @Test
    public void test763() {
        System.out.println(partitionLabels("ababcbacadefegdehijhklij"));
    }

    /**
     * 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
     * <p>
     * 示例：
     * 输入：S = "ababcbacadefegdehijhklij"
     * 输出：[9,7,8]
     * 解释：
     * 划分结果为 "ababcbaca", "defegde", "hijhklij"。
     * 每个字母最多出现在一个片段中。
     * 像 "ababcbacadefegde", "hijhklij" 的划分是错误的，因为划分的片段数较少。
     * <p>
     * 提示：
     * S的长度在[1, 500]之间。
     * S只包含小写字母 'a' 到 'z' 。
     *
     * @param s
     * @return
     */
    public List<Integer> partitionLabels(String s) {
        List<Integer> result = new ArrayList<>();
        int[] map = new int[26];
        // 记录每个字符出现的最后位置
        for (int i = 0; i < s.length(); i++) {
            map[s.charAt(i) - 'a'] = i;
        }
        // max为最远边界，pre为上一个分割线的位置,下标从0开始，所以pre开始为-1
        int max = 0, pre = -1;
        for (int i = 0; i < s.length(); i++) {
            // 找到最远边界
            max = Math.max(max, map[s.charAt(i) - 'a']);
            // 当前下标为最远边界
            if (i == max) {
                result.add(i - pre);
                pre = i;
            }
        }
        return result;
    }

}
